// 声明语法名称 文件名相同 Antlr的语法DSL
// Cymbol v1
grammar Cymbol;

// 多个声明
compilationUnit: (varDeclaration  | methodDeclaration | structDeclaration)*;

// 变量声明 'int i = 2;' 'int j;'
varDeclaration : type ID ('=' expression) ? ';';

// 函数声明
methodDeclaration: type ID '(' formalParmeters? ')' block;
formalParmeters: type ID (',' type ID)*;
block :'{' statement* '}';

// 结构体struct声明
structDeclaration: 'struct' ID '{' structMember+ '}' ';';
structMember: type ID ';' 
    | structDeclaration
    ;

statement 
    : block
    | varDeclaration
    | structDeclaration
    | 'return' expression ? ';'
    | postfixEpression ('=' expression | ) ';'
;

expressionList : expression (',' expression)* | ;

expression : addExpression;

// i+2;
addExpression: postfixEpression ('+' postfixEpression)* ;

// 基础数据, 函数调用 f(1+3,2) 
postfixEpression 
    : primary  ( '(' expressionList ')')* //MethodCall(...)
    | primary ('.' ID)*  //struct.Fields
    ;

// 原子数据
primary : INT | ID | '(' expression ')';

// 
type : 'float' | 'int' | 'void' 
    | ID  //struct name
    ;
// 词法解析器
ID : LETTER (LETTER | INT)*;
fragment LETTER : [a-zA-Z];
INT : [0-9]+;

// 空格
WS : (' ' |'\r'|'\n'|'\t') ->skip;
// 注释
SL_COMMENT : '//' ~('\r'|'\n')* '\r' ? '\n' -> skip;
